package com.xianyl.libsforandroid.account;

import java.util.HashMap;
import java.util.Map;

import com.xianyl.libsforandroid.XConstent;
import com.xianyl.libsforandroid.utils.ArrayUtils;
import com.xianyl.libsforandroid.utils.MapUtils;
import com.xianyl.libsforandroid.utils.ToastUtils;

import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

/**
 * 用户管理器
 * 建议设置PromptListener
 * @author xianyl
 * @date 2015-3-1 下午8:11:53
 */
public class AccountManager {
	private String TAG = "UserManager";
	private Context mContext;
	
	//可以操作帐号的对象
	private AccountOperation mAccountOperation;
	//验证帐号信息的监听器
	private PromptListener mPromptListener;
	
	
	/**
	 * 构造方法
	 * @param context
	 * @param userOperation 可以操作帐号的对象,这是一个接口,需要具体实现
	 */
	public AccountManager(Context context, AccountOperation accountOperation) {
		this.mContext = context;
		this.mAccountOperation = accountOperation;
	}

	
	/**设置验证帐号信息的监听器**/
	public void setPromptListener(PromptListener promptListener) {
		this.mPromptListener = promptListener;
	}



	/**
	 * 登陆帐号的方法
	 * @param mAttributeViews 存放控件的集合,key是标识用户信息字段的常量,value是录入用户信息的的EditText,不能为空
	 * @param fieldArr 存放标识用户信息字段的常量,表示收集这些常量的值,可以传null,默认new String[]{XConstent.USER_NAME,XConstent.USER_PASSWORD}
	 */
	public void Login(Map<String, EditText> mAttributeViews, String[] fieldArr) {
		//先退出软键盘
		closeSoftKeyboard();		
		if(MapUtils.isEmpty(mAttributeViews)){
			Log.e(TAG, "当前录入用户控件的信息为空!");
			return;
		}
		if(ArrayUtils.isEmpty(fieldArr)){
			//如果不传入fieldArr,使用默认字段
			fieldArr = new String[]{XConstent.USER_NAME,XConstent.USER_PASSWORD};
		}
		//从控件获取属性
		Map<String, String> map = getAttributeFromView(mAttributeViews, fieldArr);
		if(MapUtils.isEmpty(map)) return;
		//调用登陆的方法
		mAccountOperation.login(mContext, map, fieldArr);			
	}
	/**
	 * 注册帐号的方法
	 * @param mAttributeViews 存放控件的集合,key是标识用户信息字段的常量,value是录入用户信息的的EditText,不能为空
	 * @param fieldArr 存放标识用户信息字段的常量,表示收集这些常量的值,可以传null,默认new String[]{XConstent.USER_NAME,XConstent.USER_PASSWORD,XConstent.USER_PASSWORD_CONFIRM,XConstent.USER_EMAIL}
	 */
	public void register(Map<String, EditText> mAttributeViews, String[] fieldArr) {		
		//先退出软键盘
		closeSoftKeyboard();		
		if(MapUtils.isEmpty(mAttributeViews)){
			Log.e(TAG, "当前录入用户控件的信息为空!");
			return;
		}
		if(ArrayUtils.isEmpty(fieldArr)){
			//如果不传入fieldArr,使用默认字段
			fieldArr = new String[]{XConstent.USER_NAME,XConstent.USER_PASSWORD,XConstent.USER_PASSWORD_CONFIRM,XConstent.USER_EMAIL};
		}
		//从控件获取属性
		Map<String, String> map = getAttributeFromView(mAttributeViews, fieldArr);
		if(MapUtils.isEmpty(map)) return;
		
		//调用登陆的方法
		mAccountOperation.register(mContext, map, fieldArr);
	}
	
		
	
	/**
	 * 在属性控件中获取值
	 * @param mAttributeViews
	 * @param fieldArr
	 * @return
	 */
	private Map<String, String> getAttributeFromView(Map<String, EditText> mAttributeViews, String[] fieldArr) {
		Map<String, String> attributes = new HashMap<String, String>();
		EditText textView;
		String attribute;
		for(String field : fieldArr){
			textView = mAttributeViews.get(field);
			//如果没有控件,直接返回null
			if(textView == null){
				Log.e(TAG, "用户信息控件跟用户字段不对称! ");
				return null;
			}
			attribute = textView.getText().toString().trim();
			//如果获取的属性值为空
			if(TextUtils.isEmpty(attribute)){
				if(mPromptListener != null)
					mPromptListener.prompt(textView, field);
				return null;
			}
			attributes.put(field, attribute);
		}		
		// 获取字段的值并检查是否符合规则 ,并返回
		return chackValueRegular(attributes, fieldArr);
	}
	
	/**检查数据是否符合指定的正则表达式***/
	private Map<String, String> chackValueRegular(Map<String, String> attributes, String[] fieldArr) {
		if(mPromptListener != null){
			return mPromptListener.validation(attributes, fieldArr);
		}
		//默认验证
		String passWord = null;
		String value;
		for(String field : fieldArr){
			//这个时候,value不可能为null了
			value = attributes.get(field);
			if(XConstent.USER_NAME.equals(field)){				
				if (!value.matches(XConstent.REGEX_USERNAME_DEFAULT)) {
					ToastUtils.show(mContext, "用户名长度必须为2-20个字符，由字母、数字、非空白符组成!");
					return null;
				}
			}else if(XConstent.USER_EMAIL.equals(field)){
				if (!value.matches(XConstent.REGEX_EMAIL_DEFAULT)) {
					ToastUtils.show(mContext, "此邮箱名字不合法");
					return null;
				}
			}else if(XConstent.USER_PASSWORD.equals(field)){
				if (!value.matches(XConstent.REGEX_PASSWORD_DEFAULT)) {
					ToastUtils.show(mContext, "密码长度必须为6-20个字符，由字母、数字、非空白符组成!");
					return null;
				}
				passWord = value;
			}else if(XConstent.USER_PASSWORD_CONFIRM.equals(field)){
				if (!value.equals(passWord)) {
					ToastUtils.show(mContext, "两次输入的密码对不上!");
					return null;
				}
			}
		}		
		return attributes;
	}
	
	
	
	/**关闭软键盘的方法**/
	private void closeSoftKeyboard(){
		//如果输入法是打开状态，隐藏输入法
		InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
		if (imm.isActive()) {
			//关闭软键盘，开启方法相同，这个方法是切换开启与关闭状态的
			imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_NOT_ALWAYS);
		}
	}
	
	
	
}
